Flutter Android Virtual Display 实现原理
Virtual displays 是《Flutter 内嵌原生视图能力》在 Android 侧的第一套实现。在本文中,介绍它的实现原理。
如《Flutter Virtual displays》笔记中介绍:
虚拟显示将 android.view.View 实例渲染到一个纹理上,因此它不会嵌入到 Android Activity 的视图层级中。某些平台交互,如键盘处理和辅助功能可能无法工作。
使用 VirtualDisplay 机制,将原生视图渲染为纹理。在 Flutter 界面上开辟一个同样大小的只为,使用 Flutter Texture 渲染。这种不会附加到视图层次结构中。
如果你想了解如何写代码使用 Flutter Android 下的 Virtual displays 模式,可参考 《Flutter 内嵌原生视图 Android 端接入实现》 这篇文章。 在本文剩下的篇幅中,将介绍 Virtual displays 模式的底层实现原理。
注意,本文基于 Flutter Engine 2.10.5 版本。未来我也会基于 Flutter 3 新版本进行回顾,到时再更新本文。Flutter Engine 2.10.5 对应的 commit 为:57d3bac3dd5cb5b0e464ab70e7bc8a0d8cf083ab
Flutter 侧代码实现
在 Flutter 侧,开发者直接打交道的组件是 AndroidView。我们按照自底向上的方式,从最底层实现开始,一层层向上,最终到达开发者熟悉的 AndroidView。
- AndroidView 中通过层层封装,最终负责展示的组件 RenderAndroidView,它是一个 RenderObject,负责实际的嵌入 Android 视图展示。
- 在本文中,我们将介绍 RenderAndroidView 的实现,了解了它,就了解了 Virtual displays 在 Flutter 侧和核心原理。上层的类,只是进行一些封装和通信功能。
《Flutter AndroidViewController》
- AndroidView 是一个 StatefulWidget,由于其 State 逻辑较多,于是抽出一个 AndroidViewController 类用于封装嵌入 Android 视图相关的逻辑。
- 在本文中,我们将详细介绍 Virtual displays 模式下 AndroidViewController 的实现原理。搞懂这些后,后续在学 AndroidView 时会轻松很多。
《Flutter TextureAndroidViewController》
- 在 Virtual displays 模式下,TextureAndroidViewController 是对《Flutter AndroidViewController》的实现。
- 在本文中分析 TextureAndroidViewController 类的实现原理。
- AndroidView 是开发者使用 Virtual displays 的开端,这个 Flutter 类也是实现 Flutter 侧 Virtual displays 机制的核心。
- 在本文中,将介绍 AndroidView 的底层实现原理。
TextureLayer
是一个在Flutter中用于处理后端纹理映射的复合图层。
Android 侧代码实现
- Flutter 的 Virtual displays 基于 Android 的 VirtualDisplay 机制,因此有必要首先搞懂最底层的原理。
《Flutter PlatformViewsChannel》
- 在 Virtual displays 模式中,Android 原生视图的创建与销毁,完全是由 Flutter 侧 AndroidView 组件的生命周期所驱动。
- AndroidView 这个 SatefulWidget 控制了什么时候要创建、销毁原生视图。
- 两者之间通过 Channel 进行通信。
《Flutter SingleViewPresentation》
- 在 Flutter 嵌原生视图能力的 Flutter Virtual displays 模式下,SingleViewPresentation 是 Android VirtualDisplay 的视图容器,平台视图既是在 SingleViewPresentation 内创建,也是由 SingleViewPresentation 触发创建。
- 在本文中,将梳理 SingleViewPresentation 内部逻辑。。
《Flutter VirtualDisplayController》
- 在 Virtual displays 模式中,Android 侧最底层是基于 Android 的 VirtualDisplay 机制实现的。而 VirtualDisplayController 这个 Java 类,就是对 Android VirtualDisplay 机制的封装。
- 因此,研究这个类,就能够了解 Virtual displays 模式在 Android 侧的核心原理。
《Flutter PlatformViewsController》
- PlatformViewsChannel 只负责接收和解析消息,但不包含处理逻辑。处理逻辑都转发到 PlatformViewsController 来进行实际处理。另外一点,不论是 Virtual displays 模式还是 Hybrid composition 模式,底层都由 PlatformViewsController 统一处理。
本文作者:Maeiee
本文链接:Flutter Android Virtual Display 实现原理
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!